Skip to content

Conversation

@jcortes
Copy link
Collaborator

@jcortes jcortes commented Oct 24, 2025

WHY

Resolves #18834

Summary by CodeRabbit

  • New Features

    • Automatic request retry with configurable rate-limit handling and error recovery.
    • Pagination delay option to control pacing of paginated requests.
  • Bug Fixes

    • Conversation summary now falls back to an identifier when subject is missing.
  • Chores

    • Added retry dependency and bumped component, action, and source versions.

@jcortes jcortes self-assigned this Oct 24, 2025
@vercel
Copy link

vercel bot commented Oct 24, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
Project Deployment Preview Comments Updated (UTC)
pipedream-docs Ignored Ignored Oct 24, 2025 6:08pm
pipedream-docs-redirect-do-not-edit Ignored Ignored Oct 24, 2025 6:08pm

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 24, 2025

Walkthrough

Updated many FrontApp action/source module version metadata; added retry-with-backoff for HTTP requests, Retry-After handling, and configurable delay between paginated requests; added async-retry dependency; and added a fallback for missing conversation subject in one source emitter.

Changes

Cohort / File(s) Change Summary
Action version bumps (0.0.4 → 0.0.5)
components/frontapp/actions/add-comment/add-comment.mjs, components/frontapp/actions/archive-conversation/archive-conversation.mjs, components/frontapp/actions/assign-conversation/assign-conversation.mjs, components/frontapp/actions/create-draft-reply/create-draft-reply.mjs, components/frontapp/actions/create-draft/create-draft.mjs, components/frontapp/actions/get-comment/get-comment.mjs, components/frontapp/actions/get-conversation/get-conversation.mjs, components/frontapp/actions/get-teammate/get-teammate.mjs, components/frontapp/actions/list-comment-mentions/list-comment-mentions.mjs, components/frontapp/actions/list-comments/list-comments.mjs, components/frontapp/actions/list-conversations/list-conversations.mjs, components/frontapp/actions/list-teammates/list-teammates.mjs, components/frontapp/actions/tag-conversation/tag-conversation.mjs
Bumped exported action version metadata from 0.0.40.0.5. No behavioral changes.
Action version bumps (0.0.3 → 0.0.4)
components/frontapp/actions/create-inbox/create-inbox.mjs, components/frontapp/actions/create-message-template/create-message-template.mjs, components/frontapp/actions/delete-message-template/delete-message-template.mjs, components/frontapp/actions/get-message/get-message.mjs, components/frontapp/actions/list-message-templates/list-message-templates.mjs, components/frontapp/actions/update-teammate/update-teammate.mjs
Bumped exported action version metadata from 0.0.30.0.4. No behavioral changes.
Action version bumps (other versions)
components/frontapp/actions/create-message/create-message.mjs, components/frontapp/actions/import-message/import-message.mjs, components/frontapp/actions/receive-custom-messages/receive-custom-messages.mjs, components/frontapp/actions/reply-to-conversation/reply-to-conversation.mjs, components/frontapp/actions/send-new-message/send-new-message.mjs, components/frontapp/actions/update-conversation/update-conversation.mjs
Bumped various action version metadata: create-message 0.0.20.0.3; import-message 0.1.100.1.11; receive-custom-messages 0.0.70.0.8; reply-to-conversation 0.0.70.0.8; send-new-message 0.2.90.2.10; update-conversation 0.1.90.1.10.
Core retry & pagination logic
components/frontapp/frontapp.app.mjs
Added async-retry import and retry loop around axios calls (retries on 429 and 5xx, parses Retry-After, exponential backoff, logs and bails on non-retriable 4xx). Updated paginate signature to accept delayMs = 1000 and added isFirstPage handling to skip initial delay.
Rate-limit aware pagination usage
components/frontapp/sources/common/base.mjs
Call to paginate updated to pass delayMs: 1200 in startEvent to throttle page requests (1.2s gap).
Event emission fallback
components/frontapp/sources/new-conversation-created/new-conversation-created.mjs
_getEmit summary now falls back to conversation.id when conversation.subject is missing: `New conversation: ${conversation.subject
Source version bumps
components/frontapp/sources/new-conversation-state-change/new-conversation-state-change.mjs, components/frontapp/sources/new-conversation-tag/new-conversation-tag.mjs, components/frontapp/sources/new-message-template-created/new-message-template-created.mjs
Bumped exported version fields: new-conversation-state-change 0.0.60.0.7; new-conversation-tag 0.0.60.0.7; new-message-template-created 0.0.40.0.5.
Package metadata
components/frontapp/package.json
Updated package version 0.8.20.8.3; added dependency async-retry: ^1.3.3.

Sequence Diagram(s)

sequenceDiagram
    participant Caller as Caller
    participant Paginate as paginate()
    participant Retry as retryLogic
    participant API as FrontAPI

    Caller->>Paginate: Request pages (fn, params, delayMs)
    Note over Paginate: isFirstPage = true
    loop for each page
        Paginate->>Retry: call fn(params)
        Retry->>API: HTTP request
        alt 2xx Success
            API-->>Retry: response
            Retry-->>Paginate: data
        else 429 Rate limited
            API-->>Retry: 429 + Retry-After?
            Retry->>Retry: wait (Retry-After or backoff)
            Retry->>API: retry request
            API-->>Retry: response
            Retry-->>Paginate: data
        else 5xx Server error
            Retry->>Retry: exponential backoff & retry
            Retry->>API: retry
            API-->>Retry: response
            Retry-->>Paginate: data
        else 4xx (non-429)
            API-->>Retry: client error
            Retry-->>Paginate: bail with error
        end
        Note over Paginate: if !isFirstPage and delayMs>0 -> wait delayMs
        Paginate-->>Caller: yield page
        Note over Paginate: isFirstPage = false
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • jcortes

Poem

"I'm a rabbit in the code today —
I hop, I retry, I wait my way.
Delay the pages, backoff in sight,
When subjects hide I use the id by night.
Hoppy requests keep systems bright!"

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Title Check ✅ Passed The PR title "[FIX] Front New Conversation Tag rate limits" is specific and clearly describes the primary change: addressing rate limit issues in the Front integration. The changes include adding retry logic with exponential backoff for 429 and 5xx errors, implementing Retry-After header handling, adding pagination delays to reduce request volume, and logging rate limit information. The title accurately reflects the main objectives from the linked issue #18834, which focuses on investigating and fixing Front API rate limits.
Linked Issues Check ✅ Passed The PR successfully addresses the primary coding requirements from issue #18834. The changes implement retry logic with exponential backoff for 429 and 5xx errors in frontapp.app.mjs, handle Retry-After headers to respect rate limit guidance, introduce configurable delays in pagination requests to reduce request volume, and add rate limit logging and warnings. Additionally, the modification to new-conversation-created.mjs (using conversation.id as fallback for missing subject) addresses robustness concerns related to the reported emit events issue. The async-retry dependency addition and version increments across affected actions are necessary consequences of these implementations.
Out of Scope Changes Check ✅ Passed All changes in this PR are directly related to resolving the rate limit issues and robustness improvements outlined in issue #18834. The core retrying logic and pagination delays in frontapp.app.mjs address rate limiting. The version bumps across action and source files are expected consequences of modifying the base integration logic. The addition of the async-retry dependency supports the retry implementation. The robustness fix in new-conversation-created.mjs (handling missing subjects) relates to the reported emit events issue mentioned in the linked issue.
Description Check ✅ Passed The PR description includes the required "WHY" section from the template and appropriately references the linked issue #18834. While the description is minimal and could provide more detail about the specific changes implemented, it successfully links the PR to its source issue, which contains the full context of the investigation and requirements. The provided description satisfies the structural requirement of the template.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix-frontapp-source-too-many-requests-issue

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3438935 and 8378465.

📒 Files selected for processing (1)
  • components/frontapp/package.json (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • components/frontapp/package.json
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: pnpm publish
  • GitHub Check: Publish TypeScript components
  • GitHub Check: Lint Code Base
  • GitHub Check: Verify TypeScript components

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (7)
components/frontapp/actions/create-message-template/create-message-template.mjs (2)

89-95: Normalize inboxIds once; simplify branching.
Minor clean‑up: since the prop is string[], normalize and loop, avoiding the string/array split.

-      if (typeof inboxIds === "string") {
-        formData.append("inbox_ids", inboxIds);
-      } else if (Array.isArray(inboxIds)) {
-        for (const inboxId of inboxIds) {
-          formData.append("inbox_ids", inboxId);
-        }
-      }
+      const ids = Array.isArray(inboxIds) ? inboxIds : (inboxIds ? [inboxIds] : []);
+      for (const id of ids) formData.append("inbox_ids", id);

112-118: Avoid sending undefined fields in JSON payload.
Build data conditionally to keep the request minimal and avoid accidental validation issues.

-      data = {
-        name,
-        subject,
-        body,
-        folder_id: folderId,
-        inbox_ids: inboxIds,
-      };
+      data = {
+        name,
+        body,
+        ...(subject != null && { subject }),
+        ...(folderId != null && { folder_id: folderId }),
+        ...(Array.isArray(inboxIds) && inboxIds.length && { inbox_ids: inboxIds }),
+      };
components/frontapp/sources/common/base.mjs (1)

31-31: Make per‑page delay configurable and add light jitter.

Static 1.2s works but may be suboptimal across tenants. Recommend exposing a prop and adding small jitter to reduce herd effects.

Apply:

 export default {
   props: {
     frontapp,
     db: "$.service.db",
+    pageDelayMs: {
+      type: "integer",
+      label: "Page Delay (ms)",
+      description: "Delay between paginated API calls.",
+      default: 1200,
+      optional: true,
+      min: 0,
+    },
     timer: {
       type: "$.interface.timer",
       default: {
         intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL,
       },
     },
   },
 ...
     const items = this.frontapp.paginate({
       fn: this._getFunction(),
       params: this._getParams(lastTs),
       maxResults,
-      delayMs: 1200, // 1.2 second delay between pages to respect rate limits
+      delayMs: this.pageDelayMs, // delay between pages to respect rate limits
     });
components/frontapp/sources/new-conversation-tag/new-conversation-tag.mjs (1)

9-9: Version bump LGTM; consider consistent ms timestamps to avoid reprocessing.

_emit uses floored seconds for ts, but filters compare item.emitted_at (ms). This can cause re-scans of same-second events (dedupe prevents double emit, but wastes calls).

Apply:

-        ts: (Math.floor(item.emitted_at / 1000)) * 1000,
+        ts: item.emitted_at, // keep ms precision to align with filters
components/frontapp/frontapp.app.mjs (3)

356-376: Avoid double wait: onRetry sleep + async‑retry backoff.

You await inside onRetry (for Retry‑After) and async‑retry also applies its own backoff. This can stretch retries far beyond intent.

  • Set minTimeout: 0 and factor: 1 to rely on your explicit waits for 429s, and small fixed backoff for others.
  • Optionally increase retries to 4–5 per PR objective.
-      const retryOpts = {
-        retries: 3,
-        maxTimeout: 30000,
+      const retryOpts = {
+        retries: 4,
+        minTimeout: 0,   // rely on our explicit waits, esp. Retry-After
+        factor: 1,
+        maxTimeout: 30000,
         onRetry: async (err, attempt) => {

362-371: Honor Retry‑After HTTP‑date as well as seconds.

Header can be a delay in seconds or an HTTP‑date. Currently only seconds are handled.

-          if (status === 429) {
-            const retryAfter = err.response?.headers?.["retry-after"];
-            if (retryAfter) {
-              retryAfterDelay = parseInt(retryAfter) * 1000;
-              console.log(`Rate limit exceeded. Waiting ${retryAfter} seconds before retry (attempt ${attempt}/${retryOpts.retries})`);
-              // Wait for the Retry-After period
-              await new Promise((resolve) => setTimeout(resolve, retryAfterDelay));
-            } else {
+          if (status === 429) {
+            const ra = err.response?.headers?.["retry-after"];
+            let delayMs = null;
+            if (ra) {
+              const seconds = Number(ra);
+              if (Number.isFinite(seconds)) {
+                delayMs = seconds * 1000;
+              } else {
+                const dateMs = Date.parse(ra);
+                if (!Number.isNaN(dateMs)) delayMs = Math.max(0, dateMs - Date.now());
+              }
+            }
+            if (delayMs != null) {
+              console.log(`Rate limit exceeded. Waiting ${Math.ceil(delayMs/1000)}s before retry (attempt ${attempt}/${retryOpts.retries})`);
+              await new Promise((r) => setTimeout(r, delayMs));
+            } else {
               console.log(`Rate limit exceeded. Using exponential backoff (attempt ${attempt}/${retryOpts.retries})`);
             }
           } else {

694-708: Add small random jitter to pagination delay (optional).

Helps distribute load when many sources poll simultaneously.

-    async *paginate({
-      fn, params = {}, maxResults = null, delayMs = 1000, ...args
+    async *paginate({
+      fn, params = {}, maxResults = null, delayMs = 1000, delayJitterMs = 0, ...args
     }) {
 ...
-        if (!isFirstPage && delayMs > 0) {
-          await new Promise((resolve) => setTimeout(resolve, delayMs));
+        if (!isFirstPage && delayMs > 0) {
+          const jitter = delayJitterMs ? Math.floor(Math.random() * delayJitterMs) : 0;
+          await new Promise((resolve) => setTimeout(resolve, delayMs + jitter));
         }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2c5f4f2 and 3438935.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (32)
  • components/frontapp/actions/add-comment/add-comment.mjs (1 hunks)
  • components/frontapp/actions/archive-conversation/archive-conversation.mjs (1 hunks)
  • components/frontapp/actions/assign-conversation/assign-conversation.mjs (1 hunks)
  • components/frontapp/actions/create-draft-reply/create-draft-reply.mjs (1 hunks)
  • components/frontapp/actions/create-draft/create-draft.mjs (1 hunks)
  • components/frontapp/actions/create-inbox/create-inbox.mjs (1 hunks)
  • components/frontapp/actions/create-message-template/create-message-template.mjs (1 hunks)
  • components/frontapp/actions/create-message/create-message.mjs (1 hunks)
  • components/frontapp/actions/delete-message-template/delete-message-template.mjs (1 hunks)
  • components/frontapp/actions/get-comment/get-comment.mjs (1 hunks)
  • components/frontapp/actions/get-conversation/get-conversation.mjs (1 hunks)
  • components/frontapp/actions/get-message/get-message.mjs (1 hunks)
  • components/frontapp/actions/get-teammate/get-teammate.mjs (1 hunks)
  • components/frontapp/actions/import-message/import-message.mjs (1 hunks)
  • components/frontapp/actions/list-comment-mentions/list-comment-mentions.mjs (1 hunks)
  • components/frontapp/actions/list-comments/list-comments.mjs (1 hunks)
  • components/frontapp/actions/list-conversations/list-conversations.mjs (1 hunks)
  • components/frontapp/actions/list-message-templates/list-message-templates.mjs (1 hunks)
  • components/frontapp/actions/list-teammates/list-teammates.mjs (1 hunks)
  • components/frontapp/actions/receive-custom-messages/receive-custom-messages.mjs (1 hunks)
  • components/frontapp/actions/reply-to-conversation/reply-to-conversation.mjs (1 hunks)
  • components/frontapp/actions/send-new-message/send-new-message.mjs (1 hunks)
  • components/frontapp/actions/tag-conversation/tag-conversation.mjs (1 hunks)
  • components/frontapp/actions/update-conversation/update-conversation.mjs (1 hunks)
  • components/frontapp/actions/update-teammate/update-teammate.mjs (1 hunks)
  • components/frontapp/frontapp.app.mjs (3 hunks)
  • components/frontapp/package.json (2 hunks)
  • components/frontapp/sources/common/base.mjs (1 hunks)
  • components/frontapp/sources/new-conversation-created/new-conversation-created.mjs (2 hunks)
  • components/frontapp/sources/new-conversation-state-change/new-conversation-state-change.mjs (1 hunks)
  • components/frontapp/sources/new-conversation-tag/new-conversation-tag.mjs (1 hunks)
  • components/frontapp/sources/new-message-template-created/new-message-template-created.mjs (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
components/frontapp/sources/new-conversation-created/new-conversation-created.mjs (1)
components/frontapp/actions/get-conversation/get-conversation.mjs (1)
  • conversation (31-34)
components/frontapp/frontapp.app.mjs (2)
components/gmail/gmail.app.mjs (2)
  • attempt (580-580)
  • delayMs (590-590)
components/frontapp/actions/get-message/get-message.mjs (1)
  • response (23-26)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: pnpm publish
  • GitHub Check: Publish TypeScript components
  • GitHub Check: Verify TypeScript components
  • GitHub Check: Lint Code Base
🔇 Additional comments (30)
components/frontapp/actions/send-new-message/send-new-message.mjs (1)

8-8: Verify consistency between version bump and runtime behavior changes.

The AI summary states there are "no changes to logic, props, or run-time behavior," yet the version is being bumped as part of a PR aimed at fixing rate-limiting issues through retry logic and exponential backoff. This suggests an inconsistency: either the underlying frontapp.sendMessage() call (line 159) now includes retry logic (which would constitute a runtime behavior change), or the version bump is not justified.

Please verify that:

  1. The frontapp.sendMessage() method in frontapp.app.mjs includes the expected retry logic for 429 and 5xx errors
  2. If so, whether the version bump should be reflected as a patch version (0.2.10) rather than just metadata, given the improved resilience constitutes a user-facing behavioral change
components/frontapp/actions/create-message-template/create-message-template.mjs (1)

9-9: Version bump to 0.0.4 correctly enables rate-limit retries and backoff.

The frontapp.app.mjs makeRequest method (lines 351–408) wraps all HTTP calls via retry() with:

  • 3 retries and 30s maxTimeout
  • 429 status detection with Retry-After header extraction and exponential backoff
  • 5xx error retry
  • Headers properly merged and forwarded to the axios call

The createMessageTemplate action delegates through makeRequest, so it will automatically inherit this centralized retry logic.

components/frontapp/actions/list-comment-mentions/list-comment-mentions.mjs (1)

7-7: Version bump approved.

The version update aligns with the broader PR changes to FrontApp actions.

components/frontapp/actions/update-conversation/update-conversation.mjs (1)

8-8: Version bump approved.

Consistent version increment for the coordinated FrontApp action release.

components/frontapp/actions/update-teammate/update-teammate.mjs (1)

7-7: Version bump approved.

Aligned with coordinated FrontApp actions versioning update.

components/frontapp/actions/receive-custom-messages/receive-custom-messages.mjs (1)

8-8: Version bump approved.

Consistent with the PR's coordinated action versioning strategy.

components/frontapp/actions/create-draft-reply/create-draft-reply.mjs (1)

8-8: Version bump approved.

Aligned with FrontApp actions versioning update.

components/frontapp/actions/get-message/get-message.mjs (1)

7-7: Version bump approved.

Consistent with coordinated FrontApp action versioning.

components/frontapp/actions/delete-message-template/delete-message-template.mjs (1)

7-7: Version bump approved.

Aligned with the coordinated FrontApp action versioning release.

components/frontapp/actions/get-conversation/get-conversation.mjs (1)

7-7: Version bump approved.

Consistent with the coordinated FrontApp action versioning update.

components/frontapp/actions/archive-conversation/archive-conversation.mjs (1)

7-7: LGTM! Version bump aligns with infrastructure improvements.

The version increment reflects the updated retry logic and pagination pacing introduced in the underlying FrontApp app module.

components/frontapp/actions/create-draft/create-draft.mjs (1)

8-8: LGTM! Version bump aligns with infrastructure improvements.

The version increment reflects the updated retry logic and pagination pacing introduced in the underlying FrontApp app module.

components/frontapp/actions/reply-to-conversation/reply-to-conversation.mjs (1)

8-8: LGTM! Version bump aligns with infrastructure improvements.

The version increment reflects the updated retry logic and pagination pacing introduced in the underlying FrontApp app module.

components/frontapp/actions/assign-conversation/assign-conversation.mjs (1)

7-7: LGTM! Version bump aligns with infrastructure improvements.

The version increment reflects the updated retry logic and pagination pacing introduced in the underlying FrontApp app module.

components/frontapp/actions/import-message/import-message.mjs (1)

8-8: LGTM! Version bump aligns with infrastructure improvements.

The version increment reflects the updated retry logic and pagination pacing introduced in the underlying FrontApp app module.

components/frontapp/actions/get-comment/get-comment.mjs (1)

7-7: LGTM! Version bump aligns with infrastructure improvements.

The version increment reflects the updated retry logic and pagination pacing introduced in the underlying FrontApp app module.

components/frontapp/actions/list-comments/list-comments.mjs (1)

7-7: LGTM! Version bump aligns with infrastructure improvements.

The version increment reflects the updated retry logic and pagination pacing introduced in the underlying FrontApp app module.

components/frontapp/actions/list-teammates/list-teammates.mjs (1)

7-7: LGTM! Version bump aligns with infrastructure improvements.

The version increment reflects the updated retry logic and pagination pacing introduced in the underlying FrontApp app module.

components/frontapp/actions/list-conversations/list-conversations.mjs (1)

7-7: LGTM: Routine version bump.

Version metadata update aligns with the PR's coordinated release for rate-limiting improvements.

components/frontapp/actions/list-message-templates/list-message-templates.mjs (1)

7-7: LGTM: Version metadata update.

components/frontapp/actions/add-comment/add-comment.mjs (1)

8-8: LGTM: Version metadata update.

components/frontapp/actions/create-message/create-message.mjs (1)

7-7: LGTM: Version metadata update.

components/frontapp/package.json (1)

14-14: LGTM: async-retry dependency supports PR objectives.

The addition of async-retry at version ^1.3.3 aligns with the PR's goals to implement exponential backoff for 429 and 5xx responses.

components/frontapp/actions/get-teammate/get-teammate.mjs (1)

7-7: LGTM: Version metadata update.

components/frontapp/actions/create-inbox/create-inbox.mjs (1)

7-7: LGTM: Version metadata update.

components/frontapp/actions/tag-conversation/tag-conversation.mjs (1)

7-7: LGTM: Version metadata update.

components/frontapp/sources/new-message-template-created/new-message-template-created.mjs (1)

9-9: Version bump looks good.

No functional changes; safe to ship.

components/frontapp/sources/new-conversation-created/new-conversation-created.mjs (2)

26-26: Good fallback for missing subjects.

subject || id prevents undefined summaries and remains stable for dedupe.


9-9: Version bump ok.

components/frontapp/frontapp.app.mjs (1)

2-2: Dependency import verified.

async-retry is declared in components/frontapp/package.json at version ^1.3.3 and locked in pnpm-lock.yaml. No action needed.

Copy link
Collaborator

@michelle0927 michelle0927 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! Ready for QA

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] Front "New Conversation Tag" rate limits

2 participants